//+------------------------------------------------------------------+
//|                                                  RadioButton.h    |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "WndContainer.h"                          // 容器窗口基类（提供控件组合能力）
#include "BmpButton.h"                             // 位图按钮类（用于单选框状态显示）
#include "Edit.h"                                  // 编辑框类（用于显示单选框文本）

//+------------------------------------------------------------------+
//| 资源定义：单选按钮的两种状态图片                                  |
//+------------------------------------------------------------------+
#resource "res\\RadioButtonOn.bmp"                 // 选中状态图片（需放置在对应路径）
#resource "res\\RadioButtonOff.bmp"                // 未选中状态图片（需放置在对应路径）

//+------------------------------------------------------------------+
//| CRadioButton 类：MQL5 单选按钮控件类                              |
//| 核心能力：组合位图按钮与文本标签，实现单选功能，支持状态切换与文本配置，|
//|           通常用于从一组选项中选择唯一项                            |
//| 适用场景：选项组（如周期选择、策略类型选择等互斥选项）               |
//+------------------------------------------------------------------+
class CRadioButton : public CWndContainer
  {
private:
   // 子控件（私有，仅内部管理）
   CBmpButton        m_button;              // 位图按钮（用于显示选中/未选中状态）
   CEdit             m_label;               // 文本标签（用于显示单选按钮的说明文本）

public:
   //----------------------------------------------------------------
   // 构造与析构函数
   //----------------------------------------------------------------
   /**
    * @brief 构造函数：初始化单选按钮默认状态
    * @details 初始化子控件（按钮和标签）的默认属性，状态默认为未选中
    */
                     CRadioButton(void);

   /**
    * @brief 析构函数：清理单选按钮资源
    * @details 依赖父类 CWndContainer 的析构逻辑，自动释放子控件资源
    */
                    ~CRadioButton(void);

   //----------------------------------------------------------------
   // 控件创建：在图表上创建单选按钮
   //----------------------------------------------------------------
   /**
    * @brief 在指定图表位置创建单选按钮控件
    * @param chart [in] 目标图表ID（0 表示当前活跃图表）
    * @param name [in] 控件唯一标识名（图表内不可重复）
    * @param subwin [in] 绑定的子窗口编号（0 = 主窗口，≥1 = 指标子窗口）
    * @param x1 [in] 左上角X坐标（像素，相对于图表窗口）
    * @param y1 [in] 左上角Y坐标（像素）
    * @param x2 [in] 右下角X坐标（像素）
    * @param y2 [in] 右下角Y坐标（像素）
    * @return bool - 创建结果：true=成功（父类初始化+子控件创建完成），false=失败
    * @note 内部会自动创建位图按钮（显示状态）和文本标签（显示说明）
    */
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);

   //----------------------------------------------------------------
   // 事件处理：响应图表与用户交互事件
   //----------------------------------------------------------------
   /**
    * @brief 处理单选按钮相关事件（如按钮点击、标签点击等）
    * @param id [in] 事件ID（如 ON_CLICK 表示点击事件）
    * @param lparam [in] 长整数参数（事件相关数据）
    * @param dparam [in] 双精度参数（事件相关数据）
    * @param sparam [in] 字符串参数（通常为控件名称，用于识别事件来源）
    * @return bool - 处理结果：true=事件已处理，false=未处理（交由父类处理）
    */
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);

   //----------------------------------------------------------------
   // 文本配置：设置/获取单选按钮的说明文本
   //----------------------------------------------------------------
   /**
    * @brief 获取当前单选按钮的说明文本
    * @return string - 说明文本（标签上显示的内容）
    */
   string            Text(void)          const;

   /**
    * @brief 设置单选按钮的说明文本
    * @param value [in] 目标说明文本（将显示在标签上）
    * @return bool - 设置结果：true=成功，false=失败
    */
   bool              Text(const string value);

   //----------------------------------------------------------------
   // 文本颜色配置：设置/获取说明文本的颜色
   //----------------------------------------------------------------
   /**
    * @brief 获取当前说明文本的颜色
    * @return color - 文本颜色（RGB 颜色值）
    */
   color             Color(void)         const;

   /**
    * @brief 设置说明文本的颜色
    * @param value [in] 目标文本颜色（RGB 颜色值）
    * @return bool - 设置结果：true=成功，false=失败
    */
   bool              Color(const color value);

   //----------------------------------------------------------------
   // 状态管理：设置/获取单选按钮的选中状态
   //----------------------------------------------------------------
   /**
    * @brief 获取当前单选按钮的选中状态
    * @return bool - 选中状态：true=已选中（显示 RadioButtonOn.bmp），false=未选中（显示 RadioButtonOff.bmp）
    */
   bool              State(void)         const;

   /**
    * @brief 设置单选按钮的选中状态
    * @param flag [in] 目标状态：true=设为选中，false=设为未选中
    * @return bool - 设置结果：true=成功（状态更新+图片切换），false=失败
    * @note 单选按钮组的互斥逻辑需在外部实现（选中当前项时取消其他项）
    */
   bool              State(const bool flag);

protected:
   //----------------------------------------------------------------
   // 子控件创建：创建按钮和标签（保护，仅内部调用）
   //----------------------------------------------------------------
   /**
    * @brief 创建单选按钮的位图按钮（状态显示）
    * @return bool - 创建结果：true=成功（按钮初始化+关联状态图片+添加到容器），false=失败
    * @note 按钮图片使用资源中定义的 RadioButtonOn.bmp 和 RadioButtonOff.bmp
    */
   virtual bool      CreateButton(void);

   /**
    * @brief 创建单选按钮的文本标签（说明文本）
    * @return bool - 创建结果：true=成功（标签初始化+设置样式+添加到容器），false=失败
    * @note 标签设为只读，背景色与容器一致（视觉上融入背景）
    */
   virtual bool      CreateLabel(void);

   //----------------------------------------------------------------
   // 子控件事件回调：处理点击事件（保护，仅子类可重写）
   //----------------------------------------------------------------
   /**
    * @brief 按钮点击事件回调
    * @return bool - 处理结果：true=成功（确保单选按钮只能被选中，点击已选中按钮无变化+发送状态变更事件），false=失败
    */
   virtual bool      OnClickButton(void);

   /**
    * @brief 标签点击事件回调
    * @return bool - 处理结果：true=成功（点击标签等同于点击按钮，切换到选中状态+发送状态变更事件），false=失败
    */
   virtual bool      OnClickLabel(void);
  };

//+------------------------------------------------------------------+
//| CRadioButton 事件映射：关联子控件事件到处理函数（用于IDE智能提示）   |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CRadioButton)
   ON_EVENT(ON_CLICK, m_button, OnClickButton)  // 按钮点击事件 → 调用 OnClickButton
   ON_EVENT(ON_CLICK, m_label, OnClickLabel)    // 标签点击事件 → 调用 OnClickLabel
EVENT_MAP_END(CWndContainer)
//+------------------------------------------------------------------+